package com.netty.otherhandler;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

/**
 * @author renyitong
 * @version 1.0.0
 * @createTime 2023年08月10日
 * @Description
 */
public class LogNettyServer {

    public static void main(String[] args) throws InterruptedException {
        // 这里我们使用NioEventLoopGroup实现类即可，创建BossGroup和WorkerGroup
        // 当然还有EpollEventLoopGroup，但是仅支持Linux，这是Netty基于Linux底层Epoll单独编写的一套本地实现，没有使用NIO那套
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        // 创建服务端启动引导类
        ServerBootstrap bootstrap = new ServerBootstrap();
        // 链式编写，很棒
        bootstrap
                .group(bossGroup, workerGroup)   // 指定事件循环组
                .channel(NioServerSocketChannel.class)  // 指定为NIO的ServerSocketChannel
                .childHandler(new ChannelInitializer<SocketChannel>() { // 注意，这里的SocketChannel不是我们NIO里面的，是Netty的
                    @Override
                    protected void initChannel(SocketChannel channel) throws Exception {
                        //获取流水线，当我们需要处理客户端的数据时，实际上是像流水线一样在处理，这个流水线上可以有很多Handler
                        channel.pipeline()
                                .addLast(new StringDecoder())
                                .addLast(new LoggingHandler(LogLevel.INFO))
                                .addLast(new ChannelInboundHandlerAdapter() {
                                    @Override
                                    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                        System.out.println("收到客户端发送的消息: " + msg);
                                        ctx.channel().writeAndFlush("已收到!");
                                    }
                                })
                                .addLast(new StringEncoder());
                    }
                });

        // 最后绑定端口，启动
        bootstrap.bind(8080);

    }


}
